CPU 上下文切换

CPU 上下文切换

上下文切换(Context Switch) 是操作系统中,当 CPU 在多个进程或线程之间切换执行时发生的操作。它是多任务系统实现并发执行的核心机制之一。

上下文 是指 CPU 运行一个进程或线程时的状态,包括以下内容:

  1. 寄存器:存储当前进程的运行状态(如指令指针、程序计数器、栈指针等)。
  2. 内存映射:包括进程的地址空间、虚拟内存页表等。
  3. CPU 状态:进程当前的运行模式(用户态或内核态)。
  4. 进程控制块(PCB):保存进程的上下文信息。

上下文切换的场景

  1. 进程上下文切换:当操作系统调度器决定暂停一个进程并切换到另一个进程时,需要保存当前进程的上下文,并恢复目标进程的上下文。
  2. 线程上下文切换:线程属于同一个进程,但每个线程有自己独立的执行上下文(如寄存器状态、栈指针),切换时也会涉及上下文保存与恢复。
  3. 中断上下文处理:当硬件或软件中断发生时,CPU 会暂停当前进程处理中断,完成后恢复原进程的上下文。

上下文切换的步骤

  1. 保存上下文:将当前进程/线程的寄存器、栈指针等信息保存到进程控制块(PCB)中。
  2. 加载新上下文:从目标进程的 PCB 中加载该进程的寄存器状态、栈指针等信息。
  3. 切换内存映射:切换虚拟内存的页表,以确保 CPU 访问的是新进程的内存空间。

上下文切换的开销: 上下文切换涉及保存和恢复进程状态、切换内存映射等操作,这需要 CPU 额外的时间。频繁的上下文切换会导致性能下降,因为每次切换时,CPU 需要停下来保存/加载状态,而不是执行有用的工作。因此,系统设计通常会尽量减少不必要的上下文切换。

1 进程上下文切换

进程上下文切换详情

调度的时机:

2 线程上下文切换

线程上下文切换详情

3 中断上下文切换

中断上下文切换详情

4 CPU 上下文切换的问题

会将大量的CPU时间浪费保存和恢复程序状态上面,缩短真正的运行时间,导致系统整体性能大幅下降

5 查看CPU上下文切换

# CPU 上下文切换
vmstat 5

输出内容:

procs -----------memory---------- ---swap-- -----io---- -system-- -------cpu-------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st gu
 1  0      0 3230412  44980 526092    0    0     5     8   49    0  0  0 99  0  0  0

内容含义查看:

vmstat(8) - Linux 手册页 --- vmstat(8) - Linux manual page: https://man7.org/linux/man-pages/man8/vmstat.8.html

重要字段:

pidstat -w 5

内容输出:

Linux 6.8.0-44-generic (dy-turbo-vm) 	09/14/2024 	_aarch64_	(2 CPU)

11:54:39 AM   UID       PID   cswch/s nvcswch/s  Command
11:54:44 AM     0        16      0.20      0.00  ksoftirqd/0
11:54:44 AM     0        17      0.40      0.00  rcu_preempt
11:54:44 AM     0        18      0.40      0.00  migration/0
11:54:44 AM     0        23      0.40      0.00  migration/1
11:54:44 AM     0        34      1.98      0.00  kcompactd0
11:54:44 AM     0        48      0.20      0.00  kworker/0:1H-kblockd
11:54:44 AM     0       470      1.39      0.00  multipathd
11:54:44 AM     0       712     10.69      0.00  vmtoolsd
11:54:44 AM     0      5892      3.17      0.00  kworker/0:1-events
11:54:44 AM     0      6488      1.98      0.00  kworker/u4:0-events_power_efficient
11:54:44 AM     0      6501      6.34      0.00  kworker/1:3-events
11:54:44 AM     0      6677      4.75      0.00  kworker/u4:2-events_unbound
11:54:44 AM  1000      6969     18.22      0.00  sshd
11:54:44 AM  1000      7085      0.20      0.00  pidstat

pidstat(1) - Linux manual page: https://man7.org/linux/man-pages/man1/pidstat.1.html

重要字段:


本文总阅读量